#include "bsp.h"


void bsp_rtc_init(void)
{
    RTC_InitTypeDef RTC_InitStructure;
    RTC_TimeTypeDef RTC_TimeStructure;
    RTC_DateTypeDef RTC_DateStructure;
    /*使能 PWR 时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    /* PWR_CR:DBF置1，使能RTC、RTC备份寄存器和备份SRAM的访问 */
    PWR_BackupAccessCmd(ENABLE);

#if defined(RTC_CLOCK_SOURCE_LSI)
    /* 使用LSI作为RTC时钟源会有误差,仅仅是为了实验方便 */

    /* 使能LSI */
    RCC_LSICmd(ENABLE);
    /* 等待LSI稳定 */
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {
    }
    /* 选择LSI做为RTC的时钟源 */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

#elif defined(RTC_CLOCK_SOURCE_LSE)
    // LSE 接 32.768khz晶振
    /* 使能LSE */
    RCC_LSEConfig(RCC_LSE_ON);
    /* 等待LSE稳定 */
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {
    }
    /* 选择LSE做为RTC的时钟源 */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

#endif /* RTC_CLOCK_SOURCE_LSI */

    /* 使能RTC时钟 */
    RCC_RTCCLKCmd(ENABLE);

    /* 等待 RTC APB 寄存器同步 */
    RTC_WaitForSynchro();

    if(RTC_ReadBackupRegister(RTC_BKP_DRX) != RTC_BKP_DATA) {
        // log_("\n\r RTC 时钟未初始化 \r\n");
        /* 如果备份寄存器中的数据不等于预设值，则表示RTC时钟未初始化 */
        /* 需要设置时间和日期 */
        RTC_WriteProtectionCmd(DISABLE);
        RTC_EnterInitMode();
        /*=====================初始化同步/异步预分频器的值======================*/
        /* 驱动日历的时钟ck_spare = LSE/[(255+1)*(127+1)] = 1HZ */

        /* 设置异步预分频器的值*/
        RTC_InitStructure.RTC_AsynchPrediv = ASYNCHPREDIV;
        /* 设置同步预分频器的值 */
        RTC_InitStructure.RTC_SynchPrediv = SYNCHPREDIV;
        RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // 24小时制
        /* 用RTC_InitStructure的内容初始化RTC寄存器 */
        if (RTC_Init(&RTC_InitStructure) == ERROR) {
            // log_("\n\r RTC 时钟初始化失败 \r\n");
            return;
				}
        // 初始化时间
        RTC_TimeStructure.RTC_H12 = RTC_H12_AMorPM;
        RTC_TimeStructure.RTC_Hours = HOURS;
        RTC_TimeStructure.RTC_Minutes = MINUTES;
        RTC_TimeStructure.RTC_Seconds = SECONDS;
        RTC_SetTime(RTC_Format_BINorBCD, &RTC_TimeStructure);
        // 初始化日期
        RTC_DateStructure.RTC_WeekDay = WEEKDAY;
        RTC_DateStructure.RTC_Date = DATE;
        RTC_DateStructure.RTC_Month = MONTH;
        RTC_DateStructure.RTC_Year = YEAR;
        RTC_SetDate(RTC_Format_BINorBCD, &RTC_DateStructure);

        RTC_ExitInitMode();
        RTC_WriteProtectionCmd(ENABLE);
        RTC_WriteBackupRegister(RTC_BKP_DRX, RTC_BKP_DATA);

    } else {
        // log_("\n\r RTC 时钟已初始化 \r\n");
    }
    // 用LSE时不能调用这句
    // PWR_BackupAccessCmd(DISABLE); // 禁止访问备份域寄存器

}


